﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ProgNetComponentsDx.Forms;
using ProgNetComponents.Classes;
using ProgNetComponentsDx.Browsers;
using System.Diagnostics;
using DevExpress.XtraEditors.Repository;
using ProgNetComponentsDx.Options;
using DevExpress.XtraEditors;
using DevExpress.Utils;

namespace BuildHelper.Work.Short
{
    public partial class OperacjeNaPlikachControl : XtraUserControl
    {
        public OperacjeNaPlikachControl()
        {
            InitializeComponent();
            
        }

        private void DisposeMe()
        {
            Setup.Brancze.BranczeTools.ActiveBranchChanged -=new EventHandler(BranczeTools_ActiveBranchChanged);
        }

        public void InitControl()
        {
            if (!this.IsDesignMode())
            {
                this.layoutProvider1.OwnerForm = FindForm();

                sqlCeDataManager1.AddTableDef(grupyPlikowDataSet.STP_GRUPY_PLIKOW, "SELECT * FROM STP_GRUPY_PLIKOW WHERE STP_GRPL_ID = @GRUPA");
                sqlCeDataManager1.AddTableDef(grupyPlikowDataSet.STP_PLIKI, "SELECT * FROM STP_PLIKI WHERE STP_PL_GRUPA = @GRUPA");
                parametr.Name = "@GRUPA";
                sqlCeDataManager1.AddTableDef(plikiDataSet.WRK_PLIKI, "SELECT * FROM WRK_PLIKI WHERE WRK_PLK_IS_SHORT = 1");
                ImageCollection list = new ImageCollection();
                list.Images.Add(commonImageCollectionFull1.Images[28]);
                list.Images.Add(commonImageCollectionFull1.Images[33]);
                list.Images.Add(Properties.Resources.tortoise_log24);
                list.Images.Add(Properties.Resources.tortoise_bl24);
                list.ImageSize = commonImageCollectionFull1.ImageSize;
                gvMain.Images = list;

                plikiDataSet.WRK_PLIKI.WRK_PLK_IS_SHORTColumn.DefaultValue = true;
                sqlCeDataManager1.FillDataSet(plikiDataSet);

                Setup.Brancze.BranczeTools.ActiveBranchChanged += new EventHandler(BranczeTools_ActiveBranchChanged);
                int size = 16;
                colOpen.ImageIndex = 0;
                colKatalog.ImageIndex = 1;
                colLog.ImageIndex = 2;
                colBlame.ImageIndex = 3;

                SetImage(rep_colOpen, commonImageCollectionFull1.Images[28].ResizeImage(size, size));
                SetImage(rep_colKatalog, commonImageCollectionFull1.Images[33].ResizeImage(size, size));
                SetImage(rep_colLog, Properties.Resources.tortoise_log24.ResizeImage(size, size));
                SetImage(rep_colBlame, Properties.Resources.tortoise_bl24.ResizeImage(size, size));

                int minSize = 30;
                colBlame.MinWidth = colBlame.MaxWidth = minSize;
                colKatalog.MinWidth = colKatalog.MaxWidth = minSize;
                colLog.MinWidth = colLog.MaxWidth = minSize;
                colOpen.MinWidth = colOpen.MaxWidth = minSize;
                BranczeTools_ActiveBranchChanged(null, null);
            }
        }
        public void SaveAll()
        {
            if (OptionCache.GetOptionBoolValue(Init.InitFormOptionNames.Rozne_Group.Skroty_Group.Pliki.AutoZapis))
                sqlCeDataManager1.UpdateDataSet(plikiDataSet);
            layoutProvider1.SaveLayout();
        }
        void BranczeTools_ActiveBranchChanged(object sender, EventArgs e)
        {
            lueBrancz1.EditValue = Setup.Brancze.BranczeTools.ActiveBranch;
        }
        private void SetImage(RepositoryItemButtonEdit rep, Image img)
        {
            rep.Buttons[0].Image = img;
            rep.Buttons[0].ImageLocation = DevExpress.XtraEditors.ImageLocation.MiddleLeft;
        }
        private Process procZmiany;

        private NamedObject parametr = new NamedObject();
        private void AddFile(string file, string grupa)
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new Action<string, string>(AddFile), file, grupa);
                return;
            }
            string fileName = file.Replace('/', '\\');
            if (!file.StartsWith("%ROOT%"))
            {
                if (file.XMatch("\\nd_src\\gene\\".XEscape()))
                {
                    fileName = "%ROOT%\\" + file.XReplace(".*?" + "\\nd_src\\gene\\".XEscape(), "").TrimStart('\\');
                }
            }
            DataRow r = plikiDataSet.WRK_PLIKI.SelectFirstRow("WRK_PLK_PLIK = " + fileName.EscapeSql() + " AND WRK_PLK_GRUPA = " + grupa.EscapeSql());
            if (r != null)
                r["WRK_PLK_ZAZNACZ"] = true;
            else
            {
                plikiDataSet.WRK_PLIKI.AddWRK_PLIKIRow(fileName, grupa, true, true);
            }
        }

        private void btnWczytajGrupę_Click(object sender, EventArgs e)
        {
            ReadGroup(true);
        }
        private void ReadGroup(bool clear)
        {
            ObjectDialogResult dlg = BrowserCache.ShowBrowserDialog(Init.InitFormBrowserNames.Setup.GrupyPlikow);
            if (dlg.DialogResult == System.Windows.Forms.DialogResult.OK)
            {
                parametr.Value = dlg.Value;
                grupyPlikowDataSet.Clear();
                grupyPlikowDataSet.AcceptChanges();
                if (sqlCeDataManager1.FillDataSet(grupyPlikowDataSet, parametr) && grupyPlikowDataSet.STP_GRUPY_PLIKOW.Rows.Count == 1)
                {
                    if (clear)
                        plikiDataSet.WRK_PLIKI.DeleteRows();

                    string grupa = grupyPlikowDataSet.STP_GRUPY_PLIKOW[0]["STP_GRPL_NAZWA"].AsString();
                    foreach (DataRow r in grupyPlikowDataSet.STP_PLIKI.Rows)
                    {
                        AddFile(r["STP_PL_PLIK"].AsString(), grupa);
                    }
                }
                else
                {
                    ShortForm.Instance.ShowDxErrorDialog("Błąd wczytywania grupy plików");
                }
            }
        }
        private void btnDodajGrupe_Click(object sender, EventArgs e)
        {
            ReadGroup(false);
        }

        private void btnZapiszGrupe_Click(object sender, EventArgs e)
        {
            InputForm f = new InputForm();
            f.InputMask = ".*{0,50}";
            f.InputMaskType = DevExpress.XtraEditors.Mask.MaskType.RegEx;
            f.ValidateValue += new ObjectValidationEventHandler(f_ValidateText);
            string nazwa = f.ShowInputDialog("Nowa Grupa Plików", "Nazwa");
            if (nazwa.IsNotNull())
            {
                grupyPlikowDataSet.Clear();
                grupyPlikowDataSet.AcceptChanges();
                BuildHelper.Setup.Pliki.PlikiDataSet.STP_GRUPY_PLIKOWRow gr = grupyPlikowDataSet.STP_GRUPY_PLIKOW.AddSTP_GRUPY_PLIKOWRow(nazwa);
                DodajPlikiDoGrupy();
                if (sqlCeDataManager1.UpdateDataSet(grupyPlikowDataSet))
                {
                    BrowserCache.RefreshCache(grupyPlikowDataSet);
                   ShortForm.Instance.ShowDxInfoDialog("Grupa dodana");
                }
                else
                {
                   ShortForm.Instance.ShowDxErrorDialog("Błąd dodawania grupy");
                }
            }
            f.Dispose();
        }
        private void DodajPlikiDoGrupy()
        {
            DataRow r;
            gvMain.ExpandAllGroups();
            for (int i = 0; i < gvMain.RowCount; i++)
            {
                r = gvMain.GetDataRow(i);
                if (r != null)
                    grupyPlikowDataSet.STP_PLIKI.AddSTP_PLIKIRow(r["WRK_PLK_PLIK"].AsString(), grupyPlikowDataSet.STP_GRUPY_PLIKOW[0]);
            }
        }
        void f_ValidateText(object sender, ObjectValidateEventArgs e)
        {
            if (e.Value.IsNull())
                e.ValidationErrorMsg = "Podaj nazwę";
            else if (BrowserCache.IsValidDisplayMember(Init.InitFormBrowserNames.Setup.GrupyPlikow, false, e.Value))
                e.ValidationErrorMsg = "Nazwa powinna być unikalna";
        }
        private void SaveGrupa(bool clear)
        {
            ObjectDialogResult dlg = BrowserCache.ShowBrowserDialog(Init.InitFormBrowserNames.Setup.GrupyPlikow);
            if (dlg.DialogResult == System.Windows.Forms.DialogResult.OK)
            {
                parametr.Value = dlg.Value;
                grupyPlikowDataSet.Clear();
                grupyPlikowDataSet.AcceptChanges();
                if (sqlCeDataManager1.FillDataSet(grupyPlikowDataSet, parametr) && grupyPlikowDataSet.STP_GRUPY_PLIKOW.Rows.Count == 1)
                {
                    if (clear)
                        grupyPlikowDataSet.STP_PLIKI.DeleteRows();
                    DodajPlikiDoGrupy();
                    if (sqlCeDataManager1.UpdateDataSet(grupyPlikowDataSet))
                    {
                        BrowserCache.RefreshCache(grupyPlikowDataSet);
                       ShortForm.Instance.ShowDxInfoDialog("Grupa uaktuaniona");
                    }
                    else
                    {
                       ShortForm.Instance.ShowDxErrorDialog("Błąd uaktualniania grupy");
                    }
                }
                else
                {
                   ShortForm.Instance.ShowDxErrorDialog("Błąd wczytywania grupy plików");
                }
            }
        }
        private void btnZapiszJakoGrupe_Click(object sender, EventArgs e)
        {
            SaveGrupa(true);
        }

        private void btnDodajDoGrupy_Click(object sender, EventArgs e)
        {
            SaveGrupa(false);
        }
        private void repDoubleButtons_ButtonClick(object sender, DevExpress.XtraEditors.Controls.ButtonPressedEventArgs e)
        {
            DataRow r = gvMain.GetFocusedDataRow();
            if (r != null)
            {
                string brancz = lueBrancz1.EditValue.AsString();
                if (brancz.IsNullOrEmpty())
                {
                    ShortForm.Instance.ShowDxInfoDialog("Wybierz brancza");
                    return;
                }
                string file = GetSelectedFile(brancz);
                if (file.IsNotNull())
                {
                    if (gvMain.FocusedColumn == colOpen)
                    {
                        GlobalTools.FilesTools.OpenFiles(EditorSource.OperacjeNaPlikach, file);
                    }
                    if (gvMain.FocusedColumn == colKatalog)
                    {
                        GlobalTools.FilesTools.OpenDirs(file);
                    }
                    else if (gvMain.FocusedColumn == colLog)
                    {
                        GlobalTools.TortoiseTools.RunTortoiseGlobal(brancz, "log", file);
                    }
                    else if (gvMain.FocusedColumn == colBlame)
                    {
                        GlobalTools.TortoiseTools.RunTortoiseGlobal(brancz, "blame", file);
                    }
                    
                }
            }
        }
        private string GetSelectedFile(string brancz)
        {
            DataRow r;
            r = BrowserCache.GetRowForValue(Init.InitFormBrowserNames.Setup.Brancze, brancz);
            if (r != null)
            {
                string root = r["STP_BR_KATALOG"].AsString();
                root = root.TrimEnd('\\') + "\\nd_src\\gene\\";
                r = gvMain.GetFocusedDataRow();
                if (r != null)
                {
                    return GlobalTools.GetFullPath(r["WRK_PLK_PLIK"].AsString(), root);
                }
            }
            return "";
        }

        private bool GetBrancz(out string brancz)
        {
            brancz = lueBrancz1.EditValue.AsString();
            if (brancz.IsNullOrEmpty())
            {
                ShortForm.Instance.ShowDxInfoDialog("Wybierz brancza.");
                return false;
            }
            return true;
        }

        #region zmiany
        private void btnWczytajZmiany1_Click(object sender, EventArgs e)
        {
            WczytajZmiany();
        }
        private void WczytajZmiany()
        {
            if (procZmiany == null)
            {
                if (!GlobalTools.TortoiseTools.CanUseTortoiseSvn())
                {
                    ShortForm.Instance.ShowDxInfoDialog("Brak TortoiseSvn. Sprawdź opcje:\n" + GlobalTools.GetOptionPath(Init.InitFormOptionNames.Setup_Group.Rozne.TortoiseSvn));
                    return;
                }
                string brancz = "";
                if (!GetBrancz(out brancz))
                    return;
                DataRow r = BrowserCache.GetRowForValue(Init.InitFormBrowserNames.Setup.Brancze, brancz);
                if (r != null)
                {
                    string root = r["STP_BR_KATALOG"].AsString();
                    procZmiany = GlobalTools.CreateCMDProcess(procZmiany_Data);
                    StartMarque("Wczytywanie zmian brancza " + brancz);
                    GlobalTools.TortoiseTools.AddSvnToPath(procZmiany);
                    string path = root + "\\nd_src\\gene";
                    procZmiany.Execute("svn st " + path.AddDoubleQuotes());
                    procZmiany.Echo("Koniec");
                }
            }
            else
            {
                ShortForm.Instance.ShowDxInfoDialog("Operacja w toku");
            }
        }
        string maskModification = "^\\s*M\\s+(.*)";
        string maskAll = "^\\s*(M|D|A)\\s+(.*)";

        private void procZmiany_Data(object sender, DataReceivedEventArgs e)
        {
            string str = e.Data.AsString();
            if (str.XMatch(maskModification))
            {
                AddFile(str.GetFirstMatch(maskModification), "Zmiany");
            }
            else if (str == "echo Koniec" || str == "Koniec")
            {
                try
                {
                    procZmiany.KillProcessTree();
                    procZmiany.Dispose();
                }
                catch { }
                procZmiany = null;
                StopMarque();
            }
        }
        private void StopMarque()
        {
            if (this.InvokeRequired)
            {
                this.Invoke(new Action(StopMarque));
                return;
            }
            marqueeProgressBarControl1.Properties.Stopped = true;
            marqueeProgressBarControl1.Text = "";
        }
        private void StartMarque(string text)
        {
            marqueeProgressBarControl1.Properties.Stopped = false;
            marqueeProgressBarControl1.Text = text;
        }
        #endregion

        #region pliki rewizji
        private void WczytajPlikiRevizji()
        {
            if (procZmiany == null)
            {
                string brancz = "";
                if (!GetBrancz(out brancz))
                    return;
                ProgNetComponentsDx.Forms.InputForm i = new ProgNetComponentsDx.Forms.InputForm();
                i.InputMaskType = DevExpress.XtraEditors.Mask.MaskType.RegEx;
                i.InputMask = "[0-9]*";
                string str = i.ShowInputDialog("Rewizja", "Rewizja");
                if (str.IsNotNull())
                {
                    rev = str;
                    if (!GlobalTools.TortoiseTools.CanUseTortoiseSvn())
                    {
                        ShortForm.Instance.ShowDxInfoDialog("Brak TortoiseSvn. Sprawdź opcje:\n" + GlobalTools.GetOptionPath(Init.InitFormOptionNames.Setup_Group.Rozne.TortoiseSvn));
                        return;
                    }
                    DataRow r = BrowserCache.GetRowForValue(Init.InitFormBrowserNames.Setup.Brancze, brancz);
                    if (r != null)
                    {
                        string root = r["STP_BR_KATALOG"].AsString().TrimEnd('\\') + "\\nd_src\\gene";
                        StartMarque("Wczytywanie plików revizji " + rev + " brancza " + brancz);
                        procZmiany = GlobalTools.CreateCMDProcess(procPlikiRewizji_Data);
                        GlobalTools.TortoiseTools.AddSvnToPath(procZmiany);
                        procZmiany.CdDir(root);
                        procZmiany.Execute("svn log -r " + rev + " --verbose");
                    }
                    procZmiany.Echo("Koniec");
                }
            }
            else
            {
                ShortForm.Instance.ShowDxInfoDialog("Operacja w toku.");
            }
        }
        string rev = "";
        private void procPlikiRewizji_Data(object sender, DataReceivedEventArgs e)
        {
            string str = e.Data.AsString();
            if (str.XMatch(maskAll))
            {
                str = str.GetFirstMatch(maskAll, 2);
                str = str.TrimStart('/');
                str = str.XReplace("^branches/([^/]*)/", "%ROOT%/");
                str = str.XReplace("^trunk/", "%ROOT%/");
                AddFile(str, "Zmiany Rewizji " + rev);
            }
            else if (str == "echo Koniec" || str == "Koniec")
            {
                try
                {
                    procZmiany.KillProcessTree();
                    procZmiany.Dispose();
                }
                catch { }
                procZmiany = null;
                StopMarque();
            }
        }

        private void btnWczytajPlikiRewizji1_Click(object sender, EventArgs e)
        {
            WczytajPlikiRevizji();
        }

        #endregion

        private void btnUsun_Click(object sender, EventArgs e)
        {
            List<DataRow> list = new List<DataRow>();
            DataRow r;

            for (int i = 0; i < gvMain.RowCount; i++)
            {
                r = gvMain.GetDataRow(i);
                if (r != null)
                    list.Add(r);
            }
            foreach (DataRow r2 in list)
                r2.Delete();
        }
        private void rep_WRK_PLK_PLIK_EditValueChanging(object sender, DevExpress.XtraEditors.Controls.ChangingEventArgs e)
        {
            string file = e.NewValue.AsString();
            string fileName = file.Replace('/', '\\');
            if (!file.StartsWith("%ROOT%"))
            {
                if (file.XMatch("\\nd_src\\gene\\".XEscape()))
                {
                    fileName = "%ROOT%\\" + file.XReplace(".*?" + "\\nd_src\\gene\\".XEscape(), "").TrimStart('\\');
                }
            }
            if (file != fileName)
                e.NewValue = fileName;
        }

        private void btnZapisz_Click(object sender, EventArgs e)
        {
            if (sqlCeDataManager1.UpdateDataSet(plikiDataSet))
            {
                ShortForm.Instance.ShowDxInfoDialog("Dane zapisane.");
            }
            else
            {
                ShortForm.Instance.ShowDxErrorDialog("Błąd zapisu");
            }
        }

        private void lueBrancz1_EditValueChanged(object sender, EventArgs e)
        {
            DataRow r = BrowserCache.GetRowForValue(Init.InitFormBrowserNames.Setup.Brancze, lueBrancz1.EditValue);
            if (r != null)
            {
                string root = r["STP_BR_KATALOG"].AsString();
                root = root.TrimEnd('\\') + "\\nd_src\\gene";
                rep_WRK_PLK_PLIK.RootDir = root;
            }
        }
    }
}
